package packageBusiness;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import packageDataAccess.CommandeSyllathequeData;
import packageDataAccess.CompositionSyllathequeData;
import packageException.*;
import packageModel.Commande;
import packageModel.Composition;

/**
 *
 * @author Lionel & Julien
 * 
 */
public class PanierManager {
    /*
     * *********************************************************************************************
     * COMMANDE - méthodes utilisées pour la récupération des commandes des utilisateurs enregistrés
     * *********************************************************************************************
     */
    
    /**
     * Crée une commande (non clôturée) à l'utilisateur passé en argument
     * 
     * @param pseudo
     * @param dateCommande
     * @param dateCloture
     * @param isCloturee
     * @return Commande
     * @throws CommandeException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public Commande insertCommande(String pseudo, GregorianCalendar dateCommande, GregorianCalendar dateCloture, Boolean isCloturee) throws 
            CommandeException, 
            InvalideDonneesException,
            DataException {
        if(pseudo.equals("") || isCloturee == null) throw new InvalideDonneesException();
        CommandeSyllathequeData cd_cs = new CommandeSyllathequeData();
        return cd_cs.insertCommande(pseudo, dateCommande, dateCloture, isCloturee);
    }
    
    /**
     * Récupère la dernière commande de l'utilisateur (non clôturée)
     * 
     * @param pseudo
     * @return Commande
     * @throws CommandeException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public Commande lastCommande(String pseudo) throws 
            CommandeException, 
            InvalideDonneesException,
            DataException {
        if(pseudo.equals("")) throw new InvalideDonneesException();
        CommandeSyllathequeData cd_cs = new CommandeSyllathequeData();
        return cd_cs.lastCommande(pseudo);
    }
    
    /**
     * Récupère le nombre de commande non clôturée de l'utilisateur (0 ou 1)
     * 
     * @param pseudo
     * @return nbCde
     * @throws CommandeException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public int getNbCommande(String pseudo) throws 
            CommandeException, 
            InvalideDonneesException,
            DataException {
        if(pseudo.equals("")) throw new InvalideDonneesException();
        CommandeSyllathequeData cd_cs = new CommandeSyllathequeData();
        return cd_cs.getNbCommande(pseudo);
    }
    
    
    /**
     * Clôture la commande dont le pseudo est passé en argument
     * 
     * @param pseudo
     * @throws InvalideDonneesException
     * @throws CommandeException
     * @throws DataException  
     */
    public void cloturerCommande(String pseudo) throws 
            InvalideDonneesException, 
            CommandeException,
            DataException {
        if(pseudo.equals("")) throw new InvalideDonneesException();
        CompositionSyllathequeData bd_cs = new CompositionSyllathequeData();
        bd_cs.cloturerCommande(pseudo);
    }
    
    /*
     * **************************************************************************************************
     * COMPOSITION  - méthodes utilisées pour la récupération des compositions d'un commande particulière
     * **************************************************************************************************
     */
    
    /**
     * Récupère les compositions correspondant au numéro de commande passé en argument
     * 
     * @param numCde
     * @return ArrayList<Composition>
     * @throws CompositionException
     * @throws CommandeException
     * @throws SyllabusException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public ArrayList<Composition> getCommandeCompo(int numCde) throws 
            CompositionException, 
            CommandeException, 
            SyllabusException, 
            InvalideDonneesException,
            DataException {
        if(numCde < 0) throw new InvalideDonneesException();
        CompositionSyllathequeData cd_cs = new CompositionSyllathequeData();
        return cd_cs.getCompositionByCde(numCde);
    }
    
    
    /**
     * Ajoute une composition à la commande passée en argument
     * 
     * @param numCde
     * @param syllabusId
     * @param quantite
     * @param prix
     * @return Composition
     * @throws CompositionException
     * @throws CommandeException
     * @throws SyllabusException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public Composition insertComposition(int numCde, int syllabusId, int quantite, double prix) throws 
            CompositionException, 
            CommandeException, 
            SyllabusException, 
            InvalideDonneesException,
            DataException {
        if(numCde < 0 || syllabusId < 0 || quantite <= 0 || quantite >= 99 || prix < 0) throw new InvalideDonneesException();
        CompositionSyllathequeData bd_cs = new CompositionSyllathequeData();
        return bd_cs.insertComposition(numCde, syllabusId, quantite, prix);
    }
    
    /**
     * Utile afin de savoir si la composition existe déjà afin de savoir s'il faut en créer une nouvelle ou 
     * simplement modifier la quantité
     * 
     * @param syllabusId
     * @param pseudo
     * @return true OR false
     * @throws CompositionException
     * @throws CommandeException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public boolean existComposition(int syllabusId, String pseudo) throws 
            CompositionException, 
            CommandeException, 
            InvalideDonneesException,
            DataException {
        if(syllabusId < 0 || pseudo.equals("")) throw new InvalideDonneesException();
        CompositionSyllathequeData bd_cs = new CompositionSyllathequeData();
        return bd_cs.existComposition(syllabusId, pseudo);
    }
    
    /**
     * Modifie la quantité de la composition correspondant au pseudo et à l'id du syllabus, 
     * les paramètres passés en arguments
     * 
     * @param syllabusId
     * @param pseudo
     * @param quantite
     * @param param
     * @return Composition
     * @throws CompositionException
     * @throws CommandeException
     * @throws SyllabusException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public Composition modifyQuantity(int syllabusId, String pseudo, int quantite, String param) throws 
            CompositionException, 
            CommandeException, 
            SyllabusException, 
            InvalideDonneesException,
            DataException {
        if(syllabusId < 0 || pseudo.equals("") || 
           quantite <= 0 || quantite >= 99 || 
           !(param.equals("egal") || param.equals("add"))
          ) throw new InvalideDonneesException();
        CompositionSyllathequeData bd_cs = new CompositionSyllathequeData();
        return bd_cs.modifyQuantity(syllabusId, pseudo, quantite, param);
    }
    
    
    /**
     * Modification du prix d'un syllabus, utile lors de l'inscription d'un nouveau professeur afin que celui-ci
     * puisse profiter des réductions.
     * 
     * @param syllabusId
     * @param pseudo
     * @param prix
     * @return Composition
     * @throws CompositionException
     * @throws SyllabusException
     * @throws CommandeException
     * @throws InvalideDonneesException
     * @throws DataException  
     */
    public Composition modifyPrix(int syllabusId, String pseudo, double prix) throws 
            CompositionException,
            SyllabusException, 
            CommandeException,
            InvalideDonneesException,
            DataException {
        if(syllabusId < 0 || pseudo.equals("") || 
                prix < 0) throw new InvalideDonneesException();
        CompositionSyllathequeData bd_cs = new CompositionSyllathequeData();
        return bd_cs.modifyPrix(syllabusId, pseudo, prix);
    }
    
}
